package test

import (
	"encoding/json"
	"fmt"
	"github.com/gofiber/fiber/v2"
	"gorm.io/datatypes"
)

type _typeJson struct {
	TypeList []_itemJson `json:"typeList"`
}

// 1,复杂json
type _itemJson struct {
	Name string `json:"name"`
	Icon string `json:"icon"`
}

func Test(ctx *fiber.Ctx) error {
	// 复杂json增删改查
	// json定义时，最后一个item不能添加,否则解释失败！
	//jsonData := []byte(`
	//{
	//	"typeList": [
	//		{"name": "测试1", "icon": "t1"},
	//		{"name": "测试2", "icon": "t2"},
	//		{"name": "测试3", "icon": "t3"},
	//		{"name": "测试4", "icon": "t4"},
	//		{"name": "测试5", "icon": "t5"},
	//		{"name": "测试6", "icon": "t6"}
	//	]
	//}
	//`)

	var jsonData []_itemJson
	jsonData = append(jsonData, _itemJson{
		Name: "测试1",
		Icon: "ICON1",
	})
	jsonData = append(jsonData, _itemJson{
		Name: "测试5",
		Icon: "ICON5",
	})

	// 1，interface{}解释为json
	// 结果可以保存到数据库
	// 方式一
	var jsonResult = _typeJson{TypeList: jsonData}
	data, _ := json.Marshal(jsonResult)
	fmt.Printf("%s\n", data)
	fmt.Printf("%s\n", data)

	// 方式二
	sqlSaveJson := datatypes.JSON(data)
	fmt.Printf("%s\n", sqlSaveJson)

	// 2，测试更新json
	// 定义一个新的json容器
	var newJsonList []_itemJson

	// 遍历原来list，测试更新名称为测试5的
	for _, v := range jsonData {
		if v.Name == "测试5" {
			newJsonList = append(newJsonList, _itemJson{
				Name: "测试55new",
				Icon: v.Icon,
			})
		} else {
			// 不是修改对象
			newJsonList = append(newJsonList, v)
		}
	}

	// 更新结果转json
	var newJsonResult = _typeJson{TypeList: newJsonList}

	// 更新后的json序列化
	newData, _ := json.Marshal(newJsonResult)
	newSqlSaveData := datatypes.JSON(newData)
	fmt.Printf("更新后：%+v \n", newSqlSaveData)

	// 解释json数据为interface{}
	//var jsonSet _typeJson
	//err := json.Unmarshal(jsonData, &jsonSet)
	//if err != nil {
	//	fmt.Println("转换json到Go Interface{}出错！", err)
	//}
	//
	//// 1,获取json内部数据
	//typeList := jsonSet.TypeList
	//fmt.Printf("更新前：%+v \n", typeList)
	//fmt.Printf("更新前：%+v \n", jsonSet)
	//
	//// 2，测试更新json内部数据
	//for _, v := range typeList {
	//	if v.Name == "测试5" {
	//		v.Name = "new测试5"
	//	}
	//}
	//fmt.Printf("更新后：%+v \n", typeList)
	//fmt.Printf("更新后：%+v \n", jsonSet)

	//
	//// list 测试
	//uObj := user.User{Id: 1}
	//global.DB.First(&uObj)
	//
	//// 定义一个类型
	//type _JsonType struct {
	//	TypeList []string `json:"typeList"`
	//}
	//
	//var incomeJson _JsonType
	//if err := json.Unmarshal([]byte(uObj.IncomeType), &incomeJson); err != nil {
	//	fmt.Println(err)
	//
	//}
	//fmt.Printf("%+v", incomeJson)
	//
	//// 提取list中的数据
	//incomeList := incomeJson.TypeList
	//for _, v := range incomeList {
	//	fmt.Println(v)
	//}
	//
	//// 更新数据方法
	//// 假设将其他，更改为其他1
	//var newList []string
	//for _, x := range incomeList {
	//	if string(x) == "其他1" {
	//		newList = append(newList, "其他2")
	//	} else {
	//		newList = append(newList, x)
	//	}
	//}
	//
	//// 将整理后的新list，转为带格式（双引号，逗号）的list
	//newList2, _ := json.Marshal(newList)
	//
	//// 转datetypes.json
	//newJson := datatypes.JSON([]byte(fmt.Sprintf(`{"typeList": %v}`, string(newList2))))
	//
	//// 更新到数据库
	//uObj.IncomeType = newJson
	//r := global.DB.Save(&uObj)
	//fmt.Println(r.Error)

	// 邮件测试
	//
	//go utils.SendMail("352506521@qq.com", "测试邮件", "helloWord测试邮件")
	//
	//fmt.Println("开始线程执行")

	// redis 测试
	// redis 插入参数
	//verityCode, _ := global.Redis.Do("set", fmt.Sprintf("verytyCode_%v", global.AuthUser.UserId), "ffffffffffffffffffa")
	//fmt.Println("setRedis", verityCode)
	//
	//rr, _ := redis.String(global.Redis.Do("get", fmt.Sprintf("verytyCode_%v", global.AuthUser.UserId)))
	//
	//rtx := context.Background()
	//r := global.Redis.Set(rtx, "ddd", "FUCKKKKK", 5*1000*1000)
	//fmt.Println(r)
	//fmt.Println(r.String())
	//fmt.Println(r.String() == "ok")
	//fmt.Println(r.Val() == "OK")
	//fmt.Println(r.Val())
	//fmt.Println(r.Err())
	//fmt.Println(r.Result())
	//
	//// 测试获取
	//x, err := global.Redis.Get(rtx, "ddd").Result()
	//fmt.Println("x:", x)
	//fmt.Println("x.err", err)
	//
	//y, err2 := global.Redis.Get(rtx, "ds").Result()
	//fmt.Println("不存在的KEY", y)
	//fmt.Println("不存在的KEY", err2)
	//fmt.Println("不存在的KEY", err2 == redis.Nil)
	//fmt.Println("不存在的KEY", err2 != nil)

	//// 权限验证
	//utils.CheckPermsByTag("user", global.AuthUser.UserId, "update")
	//fmt.Println("oYo")
	//
	//type test struct {
	//	Name string `json:"name"`
	//}
	//
	//// 测试1 单层json返回
	////data := test{Name: "oYo"}
	////return ctx.JSON(resultVo.Success(data, ctx))
	//
	//// 测试2 jsonList 返回
	//var dataArray []test
	//dataArray = append(dataArray, test{Name: "1"})
	//dataArray = append(dataArray, test{Name: "2"})
	//dataArray = append(dataArray, test{Name: "3"})
	//dataArray = append(dataArray, test{Name: "4"})
	////return ctx.JSON(resultVo.Success(dataArray, ctx))

	// 测试3 用fiber.map返回一个json
	return ctx.JSON(fiber.Map{
		"status":  "done",
		"message": "请求成功！",
		//"data":    [],
	})
}
